<?php
// 应用公共文件

/**
 * 消费者实付金额 = 完税价 + 综合税 - 优惠
 * @param $dutiablePrice 完税价格
 * @param $totalTax 综合税
 * @param $coupon 优惠
 * @return string
 */
function actualPayment($dutiablePrice,$totalTax,$coupon = 0){
    return bcsub(bcadd($dutiablePrice,$totalTax,2),$coupon,2);
}

//DutiablePrice=Insurance+postFee+goodsTotalPrice
/**
 * 完税计算 = 商品申报货值 + 运费 + 保险费
 * @param $insurance 保险费
 * @param $postFee 运费
 * @param $goodsTotalPrice 商品总价，商品申报货值
 * @return void
 */
function dutiablePrice($insurance,$postFee,$goodsTotalPrice){
    return  bcadd(bcadd($insurance,$postFee,2),$goodsTotalPrice,2);
}

/**
 * 综合税计算  = 关税 + 消费税 + 增值税
 * @param $customsTax 商品关税
 * @param $consumptionTax 商品消费税
 * @param $vat 商品增值税
 * @return string
 */
function totalTax($customsTax,$consumptionTax,$vat){
    return bcadd(bcadd($customsTax,$consumptionTax,2),$vat,2);
}

/**
 * 关税 = 完税价 * 关税税率 * 折扣
 * @param $dutiablePrice 完税价
 * @param $customsTaxRate 关税税率
 * @param $discount 折扣
 * @return void
 */
function customsTax($dutiablePrice,$customsTaxRate,$discount){
    return bcmul(bcmul($dutiablePrice,$customsTaxRate),$discount,2);
}


/**
 * 消费税 ((完税价 + 关税) * 消费税率 / (1-消费税率)) * 折扣
 * @param $dutiablePrice 完税价格
 * @param $customsTax 关税
 * @param $consumptionTaxRate 消费税率
 * @param $discount 折扣
 * @return string
 */
function consumptionTax($dutiablePrice,$customsTax,$consumptionTaxRate,$discount){
    $num1 = bcadd($dutiablePrice,$customsTax,2);
    $num2 = bcsub(1,$consumptionTaxRate,3);

    return bcmul(bcdiv(bcmul($num1,$consumptionTaxRate,5),$num2,5),$discount,2);
}

/**
 * 增值税 = (完税价 + 关税 + 消费税) * 增值税率 * 折扣
 * @param $dutiablePrice 完税价格
 * @param $customsTax 关税
 * @param $consumptionTax 消费税
 * @param $vatRate 增值税率
 * @param $discount 折扣
 * @return string
 */
function vat($dutiablePrice,$customsTax,$consumptionTax,$vatRate,$discount){
    $num1 = bcadd(bcadd($dutiablePrice,$customsTax),$consumptionTax);

    return  bcmul(bcmul($num1,$vatRate),$discount,2);
}

function priceFormat($price){
    return (int) bcmul($price , 100);
}

/**
 * 提取富文本字符串的纯文本,并进行截取;
 */
function StringToText($string, $num)
{
    if ($string) {
        // 把一些预定义的 HTML 实体转换为字符
        $html_string = htmlspecialchars_decode($string);
        // 将空格替换成空
        $content = str_replace(" ", "", $html_string);
        // 函数剥去字符串中的 HTML、XML 以及 PHP 的标签,获取纯文本内容
        $contents = strip_tags($content);
        // 返回字符串中的前$num字符串长度的字符
        return mb_strlen($contents, 'utf-8') > $num ? mb_substr($contents, 0, $num, "utf-8") . '....' : mb_substr($contents, 0, $num, "utf-8");
    } else {
        return $string;
    }
}

//IP地址转整型数字
function ip2int($ip)
{
    $int = 0;
    $segments = explode('.', $ip);
    foreach ($segments as $segment) {
        $int = $int * 256 + (int) $segment;
    }
    return $int;
}

//整型数字转IP地址
function int2ip($int)
{
    $segments = array();
    for ($i = 0; $i < 4; $i++) {
        $segments[] = $int & 255;
        $int = $int >> 8;
    }
    return implode('.', array_reverse($segments));
}


//树形图转一维数组
function tree_to_list($tree, $children = 'children', &$list = array())
{
    if(is_array($tree)) {
        foreach ($tree as $key => $value) {
            $reffer = $value;
            if(isset($reffer[$children])){
                unset($reffer[$children]);
                tree_to_list($value[$children], $children,$list);
            }
            $list[] = $reffer;
        }
    }
    return $list;
}

if (!function_exists('check_card')) {
    /**
     * 身份证验证
     * @param $card
     * @return bool
     */
    function check_card($card)
    {
        $city = [11 => "北京", 12 => "天津", 13 => "河北", 14 => "山西", 15 => "内蒙古", 21 => "辽宁", 22 => "吉林", 23 => "黑龙江 ", 31 => "上海", 32 => "江苏", 33 => "浙江", 34 => "安徽", 35 => "福建", 36 => "江西", 37 => "山东", 41 => "河南", 42 => "湖北 ", 43 => "湖南", 44 => "广东", 45 => "广西", 46 => "海南", 50 => "重庆", 51 => "四川", 52 => "贵州", 53 => "云南", 54 => "西藏 ", 61 => "陕西", 62 => "甘肃", 63 => "青海", 64 => "宁夏", 65 => "新疆", 71 => "台湾", 81 => "香港", 82 => "澳门", 91 => "国外 "];
        $tip = "";
        $match = "/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/";
        $pass = true;
        if (!$card || !preg_match($match, $card)) {
            //身份证格式错误
            $pass = false;
        } else if (!$city[substr($card, 0, 2)]) {
            //地址错误
            $pass = false;
        } else {
            //18位身份证需要验证最后一位校验位
            if (strlen($card) == 18) {
                $card = str_split($card);
                //∑(ai×Wi)(mod 11)
                //加权因子
                $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
                //校验位
                $parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
                $sum = 0;
                $ai = 0;
                $wi = 0;
                for ($i = 0; $i < 17; $i++) {
                    $ai = $card[$i];
                    $wi = $factor[$i];
                    $sum += $ai * $wi;
                }
                $last = $parity[$sum % 11];
                if ($parity[$sum % 11] != $card[17]) {
                    //                        $tip = "校验位错误";
                    $pass = false;
                }
            } else {
                $pass = false;
            }
        }
        if (!$pass) return false;/* 身份证格式错误*/
        return true;/* 身份证格式正确*/
    }

}

if (!function_exists('real_total_money')){

    /**
     * @param $goods_money 商品总价
     * @param $deliver_money 运费金额
     * @param $discount_money 优惠金额
     * @param $coupon_money 优惠券金额
     * @param $tax_difference_money 税差金额
     * @return void
     */

    function real_total_money($goods_money,$deliver_money = 0,$discount_money = 0,$coupon_money = 0,$tax_difference_money = 0){
        $result1 =  bcsub(bcsub(bcadd($goods_money,$deliver_money,2) , $discount_money,2) , $coupon_money,2);

        return bcadd($result1 , $tax_difference_money,2);
    }
}

function getAfterSortByKeys($key,$array) {
    $_array_key = array_keys($array);
    $keys = array_intersect($key,$_array_key);

    return array_replace(array_flip($keys), $array);
}

function writeOperationLog($text,$dirname='operation')
{
    $now = date('Y-m-d H:i:s');
    $log_path = 'log/' . $dirname ;
    $destination = $log_path. '/'  .  date('y_m_d')  . '.log';
    if(!is_dir($log_path)) {
        mkdir($log_path,0755,true);
    }
    error_log("[{$now}] "."\r\n{$text}\r\n", 3,$destination);
}

function writeOperationLogByCommand($text,$dirname='operation')
{
    $now = date('Y-m-d H:i:s');
    $log_path = 'public/log/' . $dirname ;
    $destination = $log_path. '/'  .  date('y_m_d')  . '.log';
    if(!is_dir($log_path)) {
        mkdir($log_path,0755,true);
    }
    error_log("[{$now}] "."\r\n{$text}\r\n", 3,$destination);
}